'''
Created on 19/04/2013

@author: jean,cristian
'''
from pm.models.RolesPermisos import RolesPermisos
from pm.models.Permisos import Permisos
from . import ensureParams
from pm.database import db
from pm import app
from . import jsonifiedview
from .LoginViews import islogged
from flask import request
from sqlalchemy.exc import IntegrityError
from pm.models.Roles import Roles



@app.route('/permisos/listar', methods=['GET','POST'])
@jsonifiedview
def listarPersos():
    '''
        Lista los permisos asociados 
    '''
    params = {'GET':request.args, 'POST':request.form}[request.method]
    permisos= Permisos.query
    permisos =  permisos.filter(Permisos.nombre.like('%' + params['nombre'] + '%')) if 'nombre' in params else permisos
    permisos = permisos.filter(Permisos.descripcion.like('%' + params['descripcion'] + '%')) if 'descripcion' in params else permisos
    return permisos.order_by(Permisos.id_permiso).all()


@app.route('/permisos/listarbyrol', methods=['GET', 'POST']) 
@jsonifiedview
def listarPermisosByRol():
    '''
        Lista los permisos asociados a un rol
    '''
    params = {'GET':request.args, 'POST':request.form}[request.method]
    resp = []
    
    
    id = params ['id'] 
    rolesPermisos = RolesPermisos.query.filter(RolesPermisos.id_rol == id)
    for rp in rolesPermisos:
        permisos = Permisos.query.filter(Permisos.id_permiso == rp.id_permiso)
        for p in permisos:
            p.activo = rp.activo
            resp.append(p)
    return resp

@app.route('/permisos/listardistinct', methods=['GET', 'POST']) 
@jsonifiedview
def listarPermisosDistinct():
    '''
        Lista los permisos que no tiene a un rol
    '''
    params = {'GET':request.args, 'POST':request.form}[request.method]
    resp = []
    
    id = params ['id'] 
    permisos = Permisos.query.all()
    resp = permisos
    rolesPermisos = RolesPermisos.query.filter(RolesPermisos.id_rol == id)
    for rp in rolesPermisos:
        permisos = Permisos.query.filter(Permisos.id_permiso == rp.id_permiso)
        for p in permisos:
            band = True
            resp.remove(p)
        
    return resp

@app.route('/permisos/crear', methods=['GET', 'POST']) 
@jsonifiedview
def crearPermiso():
    '''
        Crea un nuevo permiso
    '''
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    
    
    
    if not ensureParams(params,['nombre','descripcion','activo']): 
        response ={"success" : False , "msg" : "Parametros Insuficientes"} 
        return response
    try:
        permiso = Permisos(params['nombre'],params['descripcion'],params['activo'])
        db.session.add(permiso)
        db.session.commit()
        response ={"success" : True , "msg" : "Creacion exitosa"} 
        return response
        
    except IntegrityError:
        response ={"success" : False , "msg" : "Permiso ya existente"} 
        return response
    except Exception, e:
        db.session.rollback()
        response ={"success" : False , "msg" : "Error en la base de datos"}
        return response 
    
@app.route('/permisos/modificar', methods=['GET', 'POST']) 
@jsonifiedview
def modificarPermiso():
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    
    
    
    if not ensureParams(params,['nombre','descripcion','activo']): 
        response ={"success" : False , "msg" : "Parametros Insuficientes"} 
        return response
    try:
        permiso = Permisos.query.filter(Permisos.id_permiso == params['id']).update({'nombre':params['nombre'],
        'descripcion':params['descripcion'],'activo':params['activo']})
        db.session.commit()
        response ={"success" : True , "msg" : "Actualizacion exitosa"} 
        return response
        
    except IntegrityError:
        response ={"success" : False , "msg" : "Permiso ya existente"} 
        return response
    except Exception, e:
        db.session.rollback()
        response ={"success" : False , "msg" : "Error en la base de datos"}
        return response 
    
@app.route('/permisos/asignar', methods=['GET', 'POST']) 
@jsonifiedview
def asignarPermisos():
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    
    
    
    if not ensureParams(params,['id_rol','id_permiso','activo']): 
        response ={"success" : False , "msg" : "Parametros Insuficientes"} 
        return response
    try:
        rolPermiso = RolesPermisos(params['id_rol'],params['id_permiso'],params['activo'])
        db.session.add(rolPermiso)
        db.session.commit()
        response ={"success" : True , "msg" : "Actualizacion exitosa"} 
        return response
    
    except Exception, e:
        db.session.rollback()
        response ={"success" : False , "msg" : "Error en la base de datos"}
        return response 
    
@app.route('/permisos/activarDesactivar', methods=['GET', 'POST']) 
@jsonifiedview
def activarDesactivarRolPermiso():
    """
        Permite activar o desactivar un permiso asignado a un rol
    """
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    
   
    
    if not ensureParams(params,['id_rol','activo','id_permiso']): 
        response ={"success" : False , "msg" : "Parametros Insuficientes"} 
        return response
    
    try:
        rolesPermisos = RolesPermisos.query.filter(RolesPermisos.id_rol == params['id_rol']).filter(RolesPermisos.id_permiso == params['id_permiso']).update({'activo':params['activo']})
        db.session.commit()
        response ={"success" : True , "msg" : "Actualizacion exitosa"} 
        return response
    
    except Exception, e:
        db.session.rollback()
        response ={"success" : False , "msg" : "Error en la base de datos"}
        return response 


@app.route('/permisos/desasignarpermisos', methods=['GET', 'POST']) 
@jsonifiedview
def desasignarPermisos():
    """
        Esta funcion desasigna un permiso a un rol
    """
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    
    
    try:
        rolPermiso = RolesPermisos.query.filter(RolesPermisos.id_rol_permiso == params['id']).one()
        db.session.delete(rolPermiso)
        db.session.commit()
        response ={"success" : True , "msg" : "Actualizacion exitosa"} 
        return response
    
    except Exception, e:
        db.session.rollback()
        response ={"success" : False , "msg" : "Error en la base de datos"}
        return response
    
    
@app.route('/permisos/getestadorelacion', methods=['GET', 'POST']) 
@jsonifiedview
def getestadorelacionrolpermiso():
    """
        Permite ver el estado de una relacion rol permiso
    """
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {} 
    
    
    if not ensureParams(params,['id_rol','id_permiso']):
        response ={"success" : False , "msg" : "Parametros Insuficientes"} 
        return response
    
    rolesPermisos = RolesPermisos.query.filter(RolesPermisos.id_rol == params['id_rol']).filter(RolesPermisos.id_permiso == params['id_permiso']).one()
    response ={"success" : True , "activo" : rolesPermisos.activo} 
    return response
    